package com.mall.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.mall.mapper.PmsProductCategoryAttributeRelationMapper;
import com.mall.mapper.ProductAttributeCategoryMapper;
import com.mall.mapper.ProductAttributeMapper;
import com.mall.model.domain.PmsProductAttribute;
import com.mall.model.domain.PmsProductAttributeCategory;
import com.mall.model.domain.PmsProductCategoryAttributeRelation;
import com.mall.model.vo.PageResult;
import com.mall.model.vo.ProductAttributeAndCategoryVo;
import com.mall.model.vo.productAttributeCategoryWithAttrVo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class ProductAttributeService {

    @Autowired
    private ProductAttributeCategoryMapper mapper;

    @Autowired
    private ProductAttributeMapper productAttributeMapper;

    @Autowired
    private PmsProductCategoryAttributeRelationMapper relationMapper;
    @Autowired
    private ProductAttributeCategoryMapper attributeCategoryMapper;

    /**
     * 分页获取所有商品属性分类
     *
     * @param pageNum
     * @param pageSize
     * @return
     */
    public PageResult queryAllProductAttributeCategory(Integer pageNum, Integer pageSize) {
        //构建分页参数
        Page iPage = new Page(pageNum, pageSize);
        //构建queryWrapper
        LambdaQueryWrapper<PmsProductAttributeCategory> queryWrapper = new LambdaQueryWrapper<>();
        //调用mapper查询分页数据列表
        Page<PmsProductAttributeCategory> selectPage = mapper.selectPage(iPage, queryWrapper);
        //封装分页数据   并且返回
        return new PageResult(pageNum, pageSize, (int) selectPage.getTotal(), selectPage.getRecords());
    }


    /**
     * 添加商品属性分类
     *
     * @param name
     */
    public void save(String name) {
        //构建商品属性分类对象  构建数据
        PmsProductAttributeCategory pmsProductAttributeCategory = new PmsProductAttributeCategory();
        pmsProductAttributeCategory.setName(name);
        //调用mapper保存数据
        mapper.insert(pmsProductAttributeCategory);
    }

    /**
     * 删除单个商品属性分类
     *
     * @param id
     */
    public void deleteById(Integer id) {
        mapper.deleteById(id);
    }

    /**
     * 修改商品属性分类
     *
     * @param id
     * @param name
     */
    public void updateById(Integer id, String name) {
        //根据id查询到商品属性分类对象  然后更新name
        PmsProductAttributeCategory pmsProductAttributeCategory = mapper.selectById(id);
        pmsProductAttributeCategory.setName(name);
        //调用mapper更新数据
        mapper.updateById(pmsProductAttributeCategory);
    }


    /**
     * 获取单个商品属性分类
     *
     * @param id
     * @return
     */
    public PmsProductAttributeCategory queryById(Integer id) {
        return mapper.selectById(id);
    }


    /**
     * 获取所有商品属性分类及其下属性
     *
     * @return
     */
    public List<productAttributeCategoryWithAttrVo> queryAllWithAttr() {
        //构建查询pms_product_attribute_category表的queryWrapper
        List<productAttributeCategoryWithAttrVo> vos = new ArrayList<>();
        LambdaQueryWrapper<PmsProductAttributeCategory> queryWrapper = new LambdaQueryWrapper<>();
        List<PmsProductAttributeCategory> productAttributeCategories = mapper.selectList(queryWrapper);


        //遍历商品属性分类列表  拿到商品属性分类的id   根据商品属性分类的id,
        //然后去pms_product_attribute表中product_attribute_category_id与拿到的商品属性分类的id进行比对查询
        for (PmsProductAttributeCategory productAttributeCategory : productAttributeCategories) {
            //创建vo的对象   封装数据
            productAttributeCategoryWithAttrVo vo = new productAttributeCategoryWithAttrVo();
            Long id = productAttributeCategory.getId();//商品属性分类的id

            //封装vo中的属性分类的数据
            BeanUtils.copyProperties(productAttributeCategory,vo);
            //构建查询pms_product_attribute表的查询对象
            LambdaQueryWrapper<PmsProductAttribute> wrapper = new LambdaQueryWrapper<>();
            wrapper.eq(id != null, PmsProductAttribute::getProductAttributeCategoryId, id);
            //调用productAttributeMapper查询商品属性列表
            List<PmsProductAttribute> attributeList = productAttributeMapper.selectList(wrapper);
            //将属性列表设置为vos的list
            vo.setProductAttributeList(attributeList);
            vos.add(vo);

        }
        return vos;
    }

    /**
     * 添加商品属性信息
     *
     * @param productAttribute
     * @return
     */
    public void addProductAttribute(PmsProductAttribute productAttribute) {
        productAttributeMapper.insert(productAttribute);
        //去pms_product_attribute表中查询product_attribute_category_id,type
        Long productAttributeCategoryId = productAttribute.getProductAttributeCategoryId();
        Integer type = productAttribute.getType();
        //然后根据product_attribute_category_id去pms_product_attribute_category表中与id做比对,
        PmsProductAttributeCategory productAttributeCategory = attributeCategoryMapper.selectById(productAttributeCategoryId);
        //根据type选择为pms_product_attribute_category表中的属性+1,或者是参数总数+1
        if(type==0){
            //为属性总数+1
            Integer attributeCount = productAttributeCategory.getAttributeCount();
            attributeCount=attributeCount+1;
            productAttributeCategory.setAttributeCount(attributeCount);
            attributeCategoryMapper.updateById(productAttributeCategory);
        }else {
            //为参数总数+1
            Integer paramCount = productAttributeCategory.getParamCount();
            paramCount=paramCount+1;
            productAttributeCategory.setParamCount(paramCount);
            attributeCategoryMapper.updateById(productAttributeCategory);
        }
    }


    /**
     * 批量删除商品属性
     *
     * @param ids
     */
    public void deleteBatch(List<Integer> ids) {
        //去pms_product_attribute_category中更新属性或者参数的总数量
        for (Integer id : ids) {
            PmsProductAttribute productAttribute = productAttributeMapper.selectById(id);
            Integer type = productAttribute.getType();
            //根据product_attribute_category_id去pms_product_attribute_category表中与id做比对,
            PmsProductAttributeCategory productAttributeCategory = attributeCategoryMapper.selectById(productAttribute.getProductAttributeCategoryId());
            //根据type选择为pms_product_attribute_category表中的属性-1,或者是参数总数-1
            if(type==0){
                //为属性总数-1
                Integer attributeCount = productAttributeCategory.getAttributeCount();
                attributeCount=attributeCount-1;
                productAttributeCategory.setAttributeCount(attributeCount);
                attributeCategoryMapper.updateById(productAttributeCategory);
            }else {
                //为参数总数-1
                Integer paramCount = productAttributeCategory.getParamCount();
                paramCount=paramCount-1;
                productAttributeCategory.setParamCount(paramCount);
                attributeCategoryMapper.updateById(productAttributeCategory);
            }
        }
        //批量删除
        productAttributeMapper.deleteBatchIds(ids);
    }


    /**
     * 修改商品属性信息
     *
     * @param id
     * @param productAttribute
     * @return
     */
    public void updateAttributeById(Integer id, PmsProductAttribute productAttribute) {
        //根据id查询到原本的商品属性对象
        PmsProductAttribute productAttribute1 = productAttributeMapper.selectById(id);
        //设置传递过来的productAttribute的id   并且更新保存
        productAttribute.setId(productAttribute1.getId());
        //调用productAttributeMapper更新商品属性信息
        productAttributeMapper.updateById(productAttribute);
    }


    /**
     * 查询单个商品属性
     *
     * @param id
     * @return
     */
    public PmsProductAttribute queryAttributeById(Integer id) {
        return productAttributeMapper.selectById(id);
    }


    /**
     * 根据分类查询属性列表或参数列表
     *
     * @param cid
     * @param type
     * @param pageNum
     * @param pageSize
     * @return
     */
    public PageResult queryAttributeOrParamList(Integer cid, Integer type, Integer pageNum, Integer pageSize) {
        //构建PmsProductAttribute的查询构造器  以及条件
        LambdaQueryWrapper<PmsProductAttribute> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(cid != null, PmsProductAttribute::getProductAttributeCategoryId, cid);
        queryWrapper.eq(type != null, PmsProductAttribute::getType, type);
        //构建分页参数
        Page<PmsProductAttribute> iPage = new Page<>(pageNum, pageSize);
        //调用productAttributeMapper,分页查询属性或参数列表
        Page<PmsProductAttribute> selectPage = productAttributeMapper.selectPage(iPage, queryWrapper);
        return new PageResult(pageNum, pageSize, (int) selectPage.getTotal(), selectPage.getRecords());
    }


    /**
     * 根据商品分类的id获取商品属性及属性分类
     *
     * @param productCategoryId
     * @return
     */
    public List<ProductAttributeAndCategoryVo> queryProductAttributeAndAttributeCategory(Integer productCategoryId) {
        //创建一个pmsProduct_category_attribute_relation的查询queryWrapper
        LambdaQueryWrapper<PmsProductCategoryAttributeRelation> queryWrapper = new LambdaQueryWrapper<>();
        //根据商品分类的id去pmsProduct_category_attribute_relation表中查询商品属性id
        queryWrapper.eq(productCategoryId != null, PmsProductCategoryAttributeRelation::getProductCategoryId, productCategoryId);
        //查询到的是与商品分类id相对应的商品属性id的集合
        List<PmsProductCategoryAttributeRelation> list = relationMapper.selectList(queryWrapper);

        //创建封装vo的空集合
        ArrayList<ProductAttributeAndCategoryVo> vos = new ArrayList<>();
        //遍历商品属性id的集合  去属性表中查询属性分类
        for (PmsProductCategoryAttributeRelation relation : list) {
            LambdaQueryWrapper<PmsProductAttribute> wrapper = new LambdaQueryWrapper<>();
            wrapper.eq(relation.getProductAttributeId() != null, PmsProductAttribute::getId, relation.getProductAttributeId());
            //查询到商品属性对象   查到商品属性分类id   然后封装vo
            PmsProductAttribute productAttribute = productAttributeMapper.selectOne(wrapper);
            ProductAttributeAndCategoryVo vo = new ProductAttributeAndCategoryVo();
            vo.setAttributeId(Integer.valueOf(relation.getProductAttributeId().toString()));
            vo.setAttributeCategoryId(Integer.valueOf(productAttribute.getProductAttributeCategoryId().toString()));
            //封装vo数据
            vos.add(vo);
        }
        //返回数据
        return vos;
    }
}
